/*  GNU/GPL:

    Kaisajax is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    Kaisajax is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.



+++KAISAJAX v1.0.1+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
http://kaisarcode.com/
//Testeado en IE 5, IE6, IE7, IE8, Mozilla firefox 3 - 4, Opera 9 - 11, Safari, Google Chrome
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++



+++ACTUALIZACIONES+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

-Versión 1.0.2:
	-revisados y solucionado el método send para GET y POST

Versión 1.0.1:
	Añadidos los eventos:
	-onChange
	-onProgress
	-onUninitialized
	-onLoading
	-onLoaded
	-onInteractive
	-onComplete

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++




+++ PROPIEDADES Y METODOS++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
PROPIEDADES:
kaisajax.overwrite (Boolean) -> al utilizar el método kaisajax.fill, overwrite es un Boolean que indica si el contenido HTML se reescribirá con el contenido AJAX, o si se sumará a éste.
kaisajax.method (String) -> El método de transferencia de datos ( "POST" o "GET" ).
kaisajax.asynch (Boolean) -> Indica si el proceso de transferencia será Sincrónico o Asincrónico ( No tiene sentido cambiarlo... creo, pero la posibilidad está ).
kaisajax.send ("String") -> Cadena de texto a enviarse hacia el archivo source, la cadena debe formatearse de la siguiente manera:
	kaisajax.send="variable1=valor1&variable2=valor2&variable3=valor3";


METODOS:
new kaisajax() -> constructor del objeto kaisajax.
kaisajax.load -> Inicializa la consulta AJAX, requiere un parámetro, que es el String con la URL hacia el archivo que se incluirá.
kaisajax.onChange -> Evento que se dispara al modificarse la propiedad readyState del HTTPRequest.
kaisajax.onProgress -> Evento que se dispara mientras no esté completa la consulta AJAX.
kaisajax.onUninitialized -> Evento que se dispara antes de inicializarse la consulta AJAX.
kaisajax.onLoading -> Evento que se dispara al comenzar la carga los datos via AJAX.
kaisajax.onLoaded -> Evento que se dispara al terminar de cargarse los datos via AJAX.
kaisajax.onInteractive -> Evento que se dispara al estar procesados los datos via AJAX.
kaisajax.onComplete -> Evento que se dispara al finalizarse la transacción via AJAX.
kaisajax.fill -> El método fill es una forma rápida de añadir contenido vía AJAX dentro de un contenedor HTML. Requiere un parámetro, que es el String con el ID del elemento contenedor.
kaisajax.text -> Devuelve el responseText de la consulta AJAX.
kaisajax.XML -> Devuelve el objeto XML de la consulta AJAX listo para ser parseado.


EJEMPLO DE USO:

//Este es un simple caso de uso en donde:

var ajax=new kaisajax();//se instancia el objeto kaisajax
ajax.onComplete=function(){//se determina qué se hará cuando se recuperen los datos
  alert(ajax.text());//en este caso ejecuta una alerta con el contenido recuperado
};
ajax.load("any-source-file.xml");//comienza la consulta al archivo objetivo

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
*/


function kaisajax(){
	
	this.overwrite=true;
	this.method="GET";
	this.asynch=true;
	this.send=null;
	this.onChange=new Function();
	this.onProgress=new Function();
	this.onUninitialized=new Function();
	this.onLoading=new Function();
	this.onLoaded=new Function();
	this.onInteractive=new Function();
	this.onComplete=new Function();
	
	var req = false;
	if(window.XMLHttpRequest) {
		req = new XMLHttpRequest();
	}
	if(window.ActiveXObject){
		req = new ActiveXObject("Microsoft.XMLHTTP");
	}
	
	this.fill=function(ID){
		var new_content=req.responseText;
		if(this.overwrite==false){
		document.getElementById(ID).innerHTML+=new_content;
		}else{
			document.getElementById(ID).innerHTML=new_content;
		}
	}
	
	this.text=function(){
		return req.responseText;
	}
	
	this.XML=function(){
		try{
			xml=new ActiveXObject("Microsoft.XMLDOM");
			xml.loadXML(req.responseText);
			return xml;
		}
		catch(err){
			DOMParser=new DOMParser();
			xml=DOMParser.parseFromString(req.responseText.toString(),"text/xml");
			return xml;
		}
	}
	
	this.load=function(URL){
		var onComplete=this.onComplete;
		var onChange=this.onChange;
		var onProgress=this.onProgress;
		var onUninitialized=this.onUnintialized;
		var onLoading=this.onLoading;
		var onLoaded=this.onLoaded;
		var onInteractive=this.onInteractive;
		var onComplete=this.onComplete;
		if(req) {
			req.onreadystatechange=function(){
				onChange();
				if(req.readyState<4){
					onProgress();
				}
				if(req.readyState==0){
					onUninitialized();
				}
				if(req.readyState==1){
					onLoading();
				}
				if(req.readyState==2){
					onLoaded();
				}
				if(req.readyState==3){
					onInteractive();
				}
				if(req.readyState==4){
					onComplete();
				}
			}
			if(this.method.toUpperCase()=="POST"){
				req.open(this.method,URL,this.asynch);
				req.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
				req.send(this.send);
			}
			if(this.method.toUpperCase()=="GET"){
				req.open(this.method,URL+"?"+this.send,this.asynch);
				req.send(null);
			}
		}
	}
}